package org.example;

/**
 * 两数相加
 */
public class Solution28 {

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 创建一个虚拟的头节点，方便操作
        ListNode dummyHead = new ListNode(0);
        ListNode p = l1;
        ListNode q = l2;
        ListNode current = dummyHead;
        int carry = 0; // 代表进位

        // 当两个链表都不为空，还有进位时，继续循环
        while (p != null || q != null || carry != 0) {
            // 获取当前节点的值，如果链表已经遍历完，则默认值为0
            int x = (p != null) ? p.val : 0;
            int y = (q != null) ? q.val : 0;

            // 计算当前位的和以及新的进位
            int sum = carry + x + y;
            carry = sum / 10;
            current.next = new ListNode(sum % 10);

            current = current.next;
            if (p != null) p = p.next;
            if (q != null) q = q.next;
        }

        return dummyHead.next;
    }

}
